package com.newtouch.cq.lang.util;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.log.Log;

import java.sql.Timestamp;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * @program: mcsca_cms
 * @description: CMS时间工具类
 * @author: RY
 * @create: 2019-12-11 14:06
 **/
public class DateUtils extends DateUtil {

    /**
     * 获取long类型时间 格式(yyyyMMddHHmmssSSS)
     */
    public static Long nowLong() {
        String now = DatePattern.PURE_DATETIME_MS_FORMAT.format(date());
        return NumberUtil.parseLong(now);
    }

    /**
     * 获取long类型时间 格式(yyyyMMddHHmmssSSS)
     *
     * @param date
     */
    public static Long formatLong(Date date) {
        String time = DatePattern.PURE_DATETIME_MS_FORMAT.format(date);
        return NumberUtil.parseLong(time);
    }

    /**
     * 获取String类型时间 格式(yyyyMMddHHmmssSSS)
     */
    public static String nowString() {
        return DatePattern.PURE_DATETIME_MS_FORMAT.format(date());
    }

    /**
     * 获取String类型时间 格式(yyyyMMddHHmmssSSS)
     *
     * @param date 传入时间格式参数
     * @return
     */
    public static String formatString(Date date) {
        return DatePattern.PURE_DATETIME_MS_FORMAT.format(date);
    }

    /**
     * 获取date类型时间 格式(yyyyMMddHHmmssSSS)
     *
     * @param date 传入自定义Long类型时间
     * @param log  调用类的日志对象
     */
    public static Date parseLong(long date, Log log) {
        try {
            return DatePattern.PURE_DATETIME_MS_FORMAT.parse(NumberUtil.toStr(date));
        } catch (ParseException e) {
            if (ObjectUtil.isNotNull(log)) {
                log.info("parseLong:时间转换异常，date：{}", date);
            }
        }
        return null;
    }

    /**
     * 获取当前Timestamp类型时间
     */
    public static Timestamp nowTsp() {
        return new Timestamp(System.currentTimeMillis());
    }

    /**
     * 自定义Long类型时间转Timestamp类型时间
     *
     * @param date 传入自定义Long类型时间
     * @param log  调用类的日志对象
     */
    public static Timestamp longToTsp(Long date, Log log) {
        try {
            return new Timestamp(DatePattern.PURE_DATETIME_MS_FORMAT.parse(NumberUtil.toStr(date)).getTime());
        } catch (ParseException e) {
            if (ObjectUtil.isNotNull(log)) {
                log.info("parseLong:时间转换异常，date：{}", date);
            }
        }
        return null;
    }

    /**
     * Date类型时间转Timestamp类型时间
     *
     * @param date Date类型时间
     */
    public static Timestamp dateToTsp(Date date) {
        return new Timestamp(date.getTime());
    }

    /**
     * 获取多少天以后的时间
     *
     * @param offset 天数
     */
    public static Timestamp afterTsp(int offset) {
        return new Timestamp(DateUtils.offsetDay(DateUtils.date(), offset).getTime());
    }

    /**
     * 获取时间纪元
     */
    public static Date timeEraDate() {
        return date(0);
    }

    /**
     * 自定义Long时间-当前时间=相差天数
     *
     * @param date
     * @param log
     * @return
     */
    public static long betweenLongNow(long date, Log log) {
        return between(parseLong(date, log), date(), DateUnit.DAY);
    }

    /**
     * 当前时间-Timestamp类型时间=相差天数
     *
     * @param date
     * @return
     */
    public static long betweenNowTsp(Timestamp date) {
        return between(date(), date(date.getTime()), DateUnit.DAY);
    }


    /**
     * 获取当前LocalDateTime
     * @return
     */
    public static LocalDateTime localDateTime() {
        return LocalDateTime.now();
    }



}
